package com.nageoffer.shortlink.admin.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.nageoffer.shortlink.admin.dao.entity.UserDO;
import com.nageoffer.shortlink.admin.dto.req.UserLoginRequestDTO;
import com.nageoffer.shortlink.admin.dto.req.UserRegisterRequestDTO;
import com.nageoffer.shortlink.admin.dto.req.UserUpdateRequestDTO;
import com.nageoffer.shortlink.admin.dto.resp.UserRespDTO;

import jakarta.servlet.http.HttpSession;

/**
 * 用户接口层
 */
public interface UserService extends IService<UserDO> {

    /**
     * @description: 根据用户名查询用户信息
     * @author: 刘新智
     * @date: 2025/10/20 9:51
     * @param: [username]
     * @return: com.nageoffer.shortlink.admin.dto.resp.UserRespDTO
     **/
    UserRespDTO getUserByUsername(String username);

    /**
     * @description: 判断用户名是否存在（布隆过滤器）
     * @author: 刘新智
     * @date: 2025/10/19 10:57
     * @param: [username]
     * @return: java.lang.Boolean
     **/
    Boolean hasUsername(String username);

    /**
     * @description: 注册用户
     * @author: 刘新智
     * @date: 2025/10/20 9:50
     * @param: [userRegisterRequestDTO]
     * @return: void
     **/
    void register(UserRegisterRequestDTO userRegisterRequestDTO);

    /**
     * @description: 修改用户信息
     * @author: 刘新智
     * @date: 2025/10/20 14:39
     * @param: [userUpdateRequestDTO]
     * @return: void
     **/
    void update(UserUpdateRequestDTO userUpdateRequestDTO);

    /**
     * @description: 用户登录
     * @author: 刘新智
     * @date: 2025/10/20 15:03
     * @param: [userLoginRequestDTO, session]
     * @return: com.nageoffer.shortlink.admin.dto.resp.UserRespDTO
     **/
    UserRespDTO login(UserLoginRequestDTO userLoginRequestDTO, HttpSession session);


    /**
     * @description: 用户登出
     * @author: 刘新智
     * @date: 2025/10/20 15:18
     * @param: [session]
     * @return: void
     **/
    void logout(HttpSession session);
    
    /**
     * @description: 获取当前登录用户信息
     * @author: 刘新智
     * @date: 2025/10/21
     * @param: []
     * @return: UserDO
     **/
    UserDO getCurrentUserInfo();
}